/**
 * 给你一棵 完整二叉树的根，这棵树有以下特征：
 * <p>
 * 叶子节点要么值为0要么值为1，其中0 表示False，1 表示True。
 * 非叶子节点 要么值为 2要么值为 3，其中2表示逻辑或OR ，3表示逻辑与AND。
 * 计算一个节点的值方式如下：
 * <p>
 * 如果节点是个叶子节点，那么节点的 值为它本身，即True或者False。
 * 否则，计算个孩子的节点值，然后将该节点的运算符对两个孩子值进行 运算。
 * 返回根节点root的布尔运算值。
 * <p>
 * 完整二叉树是每个节点有 0个或者 2个孩子的二叉树。
 * <p>
 * 叶子节点是没有孩子的节点。
 * https://leetcode.cn/problems/evaluate-boolean-binary-tree/
 */
class EvaluateTree {
    public boolean evaluateTree(TreeNode root) {
        int val = dfs(root);
        if (val == 1) {
            return true;
        } else {
            return false;
        }
    }

    public int dfs(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = dfs(root.left);
        int right = dfs(root.right);
        if (root.val == 1 || root.val == 0) {
            return root.val;
        } else if (root.val == 2) {
            int val = left + right;
            if (val >= 1) {
                return 1;
            } else {
                return 0;
            }
        } else {
            int val = left + right;
            if (val == 2) {
                return 1;
            } else {
                return 0;
            }
        }
    }
}